package com.fkcai.hansoul.common.util;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一响应格式封装（包含 code、message、data 字段）。
 */
@Data
@AllArgsConstructor // 全参构造器
@NoArgsConstructor  // 无参构造器
public class Result<T> {
	private Integer code;       // 返回状态码
	private String message;     // 返回消息
	private T data;             // 返回数据
	
	/* ================= 响应成功 ================= */
	/**
	 * 响应成功
	 * @return 响应成功的结果对象（无数据）
	 * @param <T> 响应数据类型
	 */
	public static <T> Result<T> success() {
		return new Result<>(ResultCode.SUCCESS.getCode(),
				ResultCode.SUCCESS.getMessage(),
				null
		);
	}
	/**
	 * 响应成功
	 * @param data 响应数据
	 * @return 响应成功的结果对象
	 * @param <T> 响应数据类型
	 */
	public static <T> Result<T> success(T data) {
		return new Result<>(ResultCode.SUCCESS.getCode(),
				ResultCode.SUCCESS.getMessage(),
				data
		);
	}
	
	
	/* ================= 响应失败 ================= */
	/**
	 * 响应失败
	 * @param resultCode 错误码
	 * @return 响应失败的结果对象
	 * @param <T> 响应数据类型
	 */
	public static <T> Result<T> fail(ResultCode resultCode) {
		return new Result<>(resultCode.getCode(),
				resultCode.getMessage(),
				null
		);
	}
	
	/**
	 * 响应失败
	 * @param resultCode 错误码
	 * @param message 错误信息
	 * @return 响应失败的结果对象（自定义错误信息）
	 * @param <T> 响应数据类型
	 */
	public static <T> Result<T> fail(ResultCode resultCode, String message) {
		return new Result<>(resultCode.getCode(),
				message,
				null
		);
	}
	
	/**
	 * 响应失败
	 * @param message 错误信息
	 * @return 响应失败的结果对象（仅包含自定义错误信息）
	 * @param <T> 响应数据类型
	 */
	public static <T> Result<T> fail(String message) {
		return new Result<>(null, message, null);
	}
	
	
	/* ================= 其他方法 ================= */
	/**
	 * 设置响应数据
	 * @param data 值
	 * @return 当前对象
	 */
	public Result<T> data (T data) {
		this.setData(data);
		
		return this;
	}
	
	
	
	/**
	 * 设置响应消息
	 * @param message 自定义消息
	 * @return 当前对象
	 */
	public Result<T> message (String message) {
		this.setMessage(message);
		
		return this;
	}

}
